home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / edit / mg2a_src.zip / TTYKBD.C < prev    next >
C/C++ Source or Header  |  1991-02-16  |  5KB  |  180 lines

  1. /*
  2.  * Name:    Mg 2a
  3.  *        IBM BIOS keyboard driver (TurboC 1.5)
  4.  *
  5.  */
  6.  
  7. #include    "def.h"
  8. #include    <dos.h>
  9.  
  10. #ifdef MSC
  11. #include    <bios.h>
  12. #endif /* MSC */
  13.  
  14. #define KMETA    METABIT
  15.  
  16. char    *keystrings[] = {
  17.     "Home",        "Down-Arrow",    "Up-Arrow",    "Left-Arrow",
  18.     "Right-Arrow",    "Page-Up",    "Page-Down",    "End",
  19.     "Delete",    "Insert",    "Control-Left", "Control-Right",
  20.     "Control-PgUp",    "Control-PgDn",    "Control-Home",    "Control-End",
  21.     "F1",        "F2",        "F3",        "F4",
  22.     "F5",        "F6",        "F7",        "F8",
  23.     "F9",        "F10",        "FS1",        "FS2",
  24.     "FS3",        "FS4",        "FS5",        "FS6",
  25.     "FS7",        "FS8",        "FS9",        "FS10",
  26.     "FC1",        "FC2",        "FC3",        "FC4",
  27.     "FC5",        "FC6",        "FC7",        "FC8",
  28.     "FC9",        "FC10",
  29. };
  30.  
  31. /* convert IBM bios extended scan codes to appropriate function key values */
  32. static KCHAR extended[] = {
  33.     -1,        -1,        -1,        0,      /* 0-3 */
  34.     -1,        -1,        -1,        -1,      /* 4-7 */
  35.     -1,        -1,        -1,        -1,      /* 8-11 */
  36.     -1,        -1,        -1,        -1,      /* 12-15 */
  37.     KMETA|'Q',    KMETA|'W',    KMETA|'E',    KMETA|'R',/* 16-19 */
  38.     KMETA|'T',    KMETA|'Y',    KMETA|'U',    KMETA|'I',/* 20-23 */
  39.     KMETA|'O',    KMETA|'P',    -1,        -1,      /* 24-27 */
  40.     -1,        -1,        KMETA|'A',    KMETA|'S',/* 28-31 */
  41.     KMETA|'D',    KMETA|'F',    KMETA|'G',    KMETA|'H',/* 32-35 */
  42.     KMETA|'J',    KMETA|'K',    KMETA|'L',    -1,      /* 36-39 */
  43.     -1,        -1,        -1,        -1,      /* 40-43 */
  44.     KMETA|'Z',    KMETA|'X',    KMETA|'C',    KMETA|'V',/* 44-47 */
  45.     KMETA|'B',    KMETA|'N',    KMETA|'M',    -1,      /* 48-51 */
  46.     -1,        -1,        /* oops - miscounted */      /* 52-53 */
  47.     -1,        -1,        -1,        -1,      /* 54-57 */
  48.     -1,        KF1,        KF2,        KF3,      /* 58-61 */
  49.     KF4,        KF5,        KF6,        KF7,      /* 62-65 */
  50.     KF8,        KF9,        KF10,        -1,      /* 66-69 */
  51.     -1,        KHOME,        KUP,        KPGUP,      /* 70-73 */
  52.     -1,        KLEFT,        -1,        KRIGHT,      /* 74-77 */
  53.     -1,        KEND,        KDOWN,        KPGDN,      /* 78-81 */
  54.     KINSERT,    KDELETE,    KSF1,        KSF2,      /* 82-85 */
  55.     KSF3,        KSF4,        KSF5,        KSF6,      /* 86-89 */
  56.     KSF7,        KSF8,        KSF9,        KSF10,      /* 90-93 */
  57.     KCF1,        KCF2,        KCF3,        KCF4,      /* 94-97 */
  58.     KCF5,        KCF6,        KCF7,        KCF8,      /* 98-101 */
  59.     KCF9,        KCF10,        KMETA|KF1,    KMETA|KF2,/* 102-105 */
  60.     KMETA|KF3,    KMETA|KF4,    KMETA|KF5,    KMETA|KF6,/* 106-109 */
  61.     KMETA|KF7,    KMETA|KF8,    KMETA|KF9,    KMETA|KF10,/* 110-113 */
  62.     -1,        KCLEFT,        KCRIGHT,    KCEND,      /* 114-117 */
  63.     KCPGDN,        KCHOME,        KMETA|'1',    KMETA|'2',/* 118-121 */
  64.     KMETA|'3',    KMETA|'4',    KMETA|'5',    KMETA|'6',/* 122-125 */
  65.     KMETA|'7',    KMETA|'8',    KMETA|'9',    KMETA|'0',/* 126-129 */
  66.     KMETA|'-',    KMETA|'=',    KCPGUP,              /* 130-132 */
  67. };
  68.  
  69. #define NEXTENDED (sizeof(extended)-sizeof(KCHAR))
  70.  
  71. static KCHAR savedkey = -1;
  72.  
  73. getkbd() {
  74.     return (ttgetc());
  75. }
  76.  
  77. /*
  78.  * Get keyboard character, and interpret
  79.  * any special keys on the keyboard.
  80.  */
  81. ttgetc() {
  82.     KCHAR temp;
  83.  
  84.     while (savedkey == -1)
  85.     getakey();
  86.  
  87.     temp = savedkey;
  88.     savedkey = -1;
  89.     return temp;
  90. }
  91.  
  92. getakey() {
  93.     union REGS rg;
  94.  
  95.     rg.h.ah = 0;        /* read keyboard */
  96.     int86(0x16, &rg, &rg);
  97.     if (rg.h.al) {
  98.     if (rg.h.al == '\b' && rg.h.ah == 0x0E)
  99.         rg.h.al = 0x7F;    /* transform backspace key into delete */
  100.                 /* control H is still backspace */
  101.     savedkey = rg.h.al;    /* normal key value */
  102.     }
  103.     else {
  104.     if (rg.h.ah >= NEXTENDED)
  105.         savedkey = -1;
  106.     else
  107.         savedkey = extended[rg.h.ah];
  108.     }
  109. }
  110.  
  111. pollkbd()
  112. {
  113. #ifdef MSC
  114.     return _bios_keybrd(_KEYBRD_READY);
  115. #else
  116.     return bioskey(1);
  117. #endif /* MSC */
  118. }
  119.  
  120. typeahead() {
  121.     if (savedkey != -1)
  122.     return 1;
  123.     if (pollkbd())
  124.     getakey();
  125.     return (savedkey != -1);
  126. }
  127.  
  128. ttykeymapinit() {
  129.     /* mg 2a no longer lets me easily bind things at run time. */
  130.     /* instead, I make up a keymap, and link it in at compile time */
  131. }
  132.  
  133. extern    int    gotobol();        /* Move to start of line    */
  134. extern    int    backchar();        /* Move backward by characters    */
  135. extern    int    gotoeol();        /* Move to end of line        */
  136. extern    int    forwchar();        /* Move forward by characters    */
  137. extern    int    gotobob();        /* Move to start of buffer    */
  138. extern    int    gotoeob();        /* Move to end of buffer    */
  139. extern    int    gotobop();        /* Move to start of display page*/
  140. extern    int    gotoeop();        /* Move to end of display page    */
  141. extern    int    forwline();        /* Move forward by lines    */
  142. extern    int    backline();        /* Move backward by lines    */
  143. extern    int    forwpage();        /* Move forward by pages    */
  144. extern    int    backpage();        /* Move backward by pages    */
  145. extern    int    openline();        /* Open up a blank line        */
  146. extern    int    forwdel();        /* Forward delete        */
  147. extern    int    rescan();        /* for unmapped keys        */
  148. extern    int    backword();        /* Backup by words        */
  149. extern    int    forwword();        /* Advance by words        */
  150. extern    int    killline();        /* Kill forward            */
  151.  
  152. PF    ibm_keys[] = {
  153.     gotobol,    /* Home            (0x100)    */
  154.     forwline,    /* Down                */
  155.     backline,    /* Up                */
  156.     backchar,    /* Left                */
  157.     forwchar,    /* Right            */
  158.     backpage,    /* Page Up            */
  159.     forwpage,    /* Page Dn            */
  160.     gotoeol,    /* End                */
  161.     forwdel,    /* Delete            */
  162.     openline,    /* Insert            */
  163.     backword,    /* Control Left            */
  164.     forwword,    /* Control Right        */
  165.     gotobob,    /* Control PgUp               */
  166.     gotoeob,    /* Control PgDn             */
  167.     gotobop,    /* Control HOME            */
  168.     gotoeop,    /* Control END            */
  169.  
  170.     /* function keys - initially unassigned */
  171.     rescan, rescan, rescan, rescan,
  172.     rescan, rescan, rescan, rescan,
  173.     rescan, rescan, rescan, rescan,
  174.     rescan, rescan, rescan, rescan,
  175.     rescan, rescan, rescan, rescan,
  176.     rescan, rescan, rescan, rescan,
  177.     rescan, rescan, rescan, rescan,
  178.     rescan, rescan,
  179. };
  180.